home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 42
/
Amiga Format AFCD42 (Issue 126, Aug 1999).iso
/
-serious-
/
emulation
/
amigavgb_ppc
/
demos
/
sound.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-17
|
23KB
|
873 lines
#include <stdlib.h>
#include <stdio.h>
#define ARROW_CHAR 3
#define SPACE_CHAR ' '
#define ARROW_X 0
#define VAL_X 15
#define TITLE_Y 0
#define FIRST_X (ARROW_X+1)
#define FIRST_Y (TITLE_Y+2)
#define PLAY 0x20
#define FREQUENCY 0x21
#define MIN(x,y) ((x) > (y) ? (y) : (x))
#define MAX(x,y) ((x) < (y) ? (y) : (x))
#define NB_MODES 5
extern unsigned char _reg_0x10;
extern unsigned char _reg_0x11;
extern unsigned char _reg_0x12;
extern unsigned char _reg_0x13;
extern unsigned char _reg_0x14;
extern unsigned char _reg_0x15;
extern unsigned char _reg_0x16;
extern unsigned char _reg_0x17;
extern unsigned char _reg_0x18;
extern unsigned char _reg_0x19;
extern unsigned char _reg_0x1A;
extern unsigned char _reg_0x1B;
extern unsigned char _reg_0x1C;
extern unsigned char _reg_0x1D;
extern unsigned char _reg_0x1E;
extern unsigned char _reg_0x1F;
extern unsigned char _reg_0x20;
extern unsigned char _reg_0x21;
extern unsigned char _reg_0x22;
extern unsigned char _reg_0x23;
extern unsigned char _reg_0x24;
extern unsigned char _reg_0x25;
extern unsigned char _reg_0x26;
enum notes {
C0, Cd0, D0, Dd0, E0, F0, Fd0, G0, Gd0, A0, Ad0, B0,
C1, Cd1, D1, Dd1, E1, F1, Fd1, G1, Gd1, A1, Ad1, B1,
C2, Cd2, D2, Dd2, E2, F2, Fd2, G2, Gd2, A2, Ad2, B2,
C3, Cd3, D3, Dd3, E3, F3, Fd3, G3, Gd3, A3, Ad3, B3,
C4, Cd4, D4, Dd4, E4, F4, Fd4, G4, Gd4, A4, Ad4, B4,
C5, Cd5, D5, Dd5, E5, F5, Fd5, G5, Gd5, A5, Ad5, B5,
SILENCE, END
};
unsigned int frequencies[] = {
44, 156, 262, 363, 457, 547, 631, 710, 786, 854, 923, 986,
1046, 1102, 1155, 1205, 1253, 1297, 1339, 1379, 1417, 1452, 1486, 1517,
1546, 1575, 1602, 1627, 1650, 1673, 1694, 1714, 1732, 1750, 1767, 1783,
1798, 1812, 1825, 1837, 1849, 1860, 1871, 1881, 1890, 1899, 1907, 1915,
1923, 1930, 1936, 1943, 1949, 1954, 1959, 1964, 1969, 1974, 1978, 1982,
1985, 1988, 1992, 1995, 1998, 2001, 2004, 2006, 2009, 2011, 2013, 2015
};
unsigned char music[] = {
C3, C3, G3, G3, A3, A3, G3, SILENCE,
F3, F3, E3, E3, D3, D3, C3, SILENCE,
G3, G3, F3, F3, E3, E3, D3, D3,
G3, G3, F3, F3, E3, E3, D3, D3,
C3, C3, G3, G3, A3, A3, G3, SILENCE,
F3, F3, E3, E3, D3, D3, C3, SILENCE,
END
};
struct Params {
char *name;
unsigned int max;
};
struct Params params_0[] = {
{ "Main Controls" , 0 },
{ "All On/Off" , 1 },
{ "Vin->SO1" , 1 },
{ "Vin->SO2" , 1 },
{ "SO1 Volume" , 7 },
{ "SO2 Volume" , 7 },
{ NULL , 0 }
};
struct Params params_1[] = {
{ "Sound Mode #1" , 0 },
{ "Swp Time" , 7 },
{ "Swp Mode" , 1 },
{ "Swp Shifts" , 7 },
{ "Pat Duty" , 3 },
{ "Sound Len" , 63 },
{ "Env Init" , 15 },
{ "Env Mode" , 1 },
{ "Env Nb Swp" , 7 },
{ "Frequency" , 2047 },
{ "Cons Sel" , 1 },
{ "Out to SO1" , 1 },
{ "Out to SO2" , 1 },
{ "On/Off" , 1 },
{ NULL , 0 }
};
struct Params params_2[] = {
{ "Sound Mode #2" , 0 },
{ "Pat Duty" , 3 },
{ "Sound Len" , 63 },
{ "Env Init" , 15 },
{ "Env Mode" , 1 },
{ "Env Nb Step" , 7 },
{ "Frequency" , 2047 },
{ "Cons Sel" , 1 },
{ "Out to SO1" , 1 },
{ "Out to SO2" , 1 },
{ "On/Off" , 1 },
{ NULL , 0 }
};
struct Params params_3[] = {
{ "Sound Mode #3" , 0 },
{ "Sound On/Off" , 1 },
{ "Sound Len" , 255 },
{ "Sel Out Level" , 3 },
{ "Frequency" , 2047 },
{ "Cons Sel" , 1 },
{ "Out to SO1" , 1 },
{ "Out to SO2" , 1 },
{ "On/Off" , 1 },
{ NULL , 0 }
};
struct Params params_4[] = {
{ "Sound Mode #4" , 0 },
{ "Sound Len" , 63 },
{ "Env Init" , 15 },
{ "Env Mode" , 1 },
{ "Env Nb Step" , 7 },
{ "Poly Cnt Freq" , 15 },
{ "Poly Cnt Step" , 1 },
{ "Poly Cnt Div" , 7 },
{ "Cons Sel" , 1 },
{ "Out to SO1" , 1 },
{ "Out to SO2" , 1 },
{ "On/Off" , 1 },
{ NULL , 0 }
};
struct Params *params_array[] = {
params_0,
params_1,
params_2,
params_3,
params_4,
};
struct Params *params;
struct SoundReg {
struct {
/* 0xFF10 */
unsigned int sweepShifts : 3;
unsigned int sweepMode : 1;
unsigned int sweepTime : 3;
unsigned int unused_1 : 1;
/* 0xFF11 */
unsigned int soundLength : 6;
unsigned int patternDuty : 2;
/* 0xFF12 */
unsigned int envNbSweep : 3;
unsigned int envMode : 1;
unsigned int envInitialValue : 4;
/* 0xFF13 */
unsigned int frequencyLow : 8;
/* 0xFF14 */
unsigned int frequencyHigh : 3;
unsigned int unused_2 : 3;
unsigned int counter_ConsSel : 1;
unsigned int restart : 1;
} mode1;
struct {
/* 0xFF15 */
unsigned int unused_1 : 8;
/* 0xFF16 */
unsigned int soundLength : 6;
unsigned int patternDuty : 2;
/* 0xFF17 */
unsigned int envNbStep : 3;
unsigned int envMode : 1;
unsigned int envInitialValue : 4;
/* 0xFF18 */
unsigned int frequencyLow : 8;
/* 0xFF19 */
unsigned int frequencyHigh : 3;
unsigned int unused_2 : 3;
unsigned int counter_ConsSel : 1;
unsigned int restart : 1;
} mode2;
struct {
/* 0xFF1A */
unsigned int unused_1 : 7;
unsigned int on_Off : 1;
/* 0xFF1B */
unsigned int soundLength : 8;
/* 0xFF1C */
unsigned int unused_2 : 5;
unsigned int selOutputLevel : 2;
unsigned int unused_3 : 1;
/* 0xFF1D */
unsigned int frequencyLow : 8;
/* 0xFF1E */
unsigned int frequencyHigh : 3;
unsigned int unused_4 : 3;
unsigned int counter_ConsSel : 1;
unsigned int restart : 1;
} mode3;
struct {
/* 0xFF1F */
unsigned int unused_1 : 8;
/* 0xFF20 */
unsigned int soundLength : 6;
unsigned int unused_2 : 2;
/* 0xFF21 */
unsigned int envNbStep : 3;
unsigned int envMode : 1;
unsigned int envInitialValue : 4;
/* 0xFF22 */
unsigned int polyCounterDiv : 3;
unsigned int polyCounterStep : 1;
unsigned int polyCounterFreq : 4;
/* 0xFF23 */
unsigned int unused_3 : 6;
unsigned int counter_ConsSel : 1;
unsigned int restart : 1;
} mode4;
struct {
/* 0xFF24 */
unsigned int SO1_OutputLevel : 3;
unsigned int Vin_SO1 : 1;
unsigned int SO2_OutputLevel : 3;
unsigned int Vin_SO2 : 1;
/* 0xFF25 */
unsigned int Sound1_To_SO1 : 1;
unsigned int Sound2_To_SO1 : 1;
unsigned int Sound3_To_SO1 : 1;
unsigned int Sound4_To_SO1 : 1;
unsigned int Sound1_To_SO2 : 1;
unsigned int Sound2_To_SO2 : 1;
unsigned int Sound3_To_SO2 : 1;
unsigned int Sound4_To_SO2 : 1;
/* 0xFF26 */
unsigned int Sound1_On_Off : 1;
unsigned int Sound2_On_Off : 1;
unsigned int Sound3_On_Off : 1;
unsigned int Sound4_On_Off : 1;
unsigned int unused_1 : 3;
unsigned int global_On_Off : 1;
} control;
};
struct SoundReg *soundReg;
int current_value(int mode, int line)
{
if(mode == 0) {
switch(line)
{
case 0: /* global_On_Off */
return soundReg->control.global_On_Off;
case 1: /* Vin_SO1 */
return soundReg->control.Vin_SO1;
case 2: /* Vin_SO2 */
return soundReg->control.Vin_SO2;
case 3: /* SO1_OutputLevel */
return soundReg->control.SO1_OutputLevel;
case 4: /* SO2_OutputLevel */
return soundReg->control.SO2_OutputLevel;
}
} else if(mode == 1) {
switch(line)
{
case 0: /* sweepTime */
return soundReg->mode1.sweepTime;
case 1: /* sweepMode */
return soundReg->mode1.sweepMode;
case 2: /* sweepShifts */
return soundReg->mode1.sweepShifts;
case 3: /* patternDuty */
return soundReg->mode1.patternDuty;
case 4: /* soundLength */
return soundReg->mode1.soundLength;
case 5: /* envInitialValue */